/**
 *
 * Created by 田珂铭 on 2017/8/8.
 */

/**
 * usage: $(id_selector).priceCalender() // 初始化
 *        $(id_selector).priceCalender('init', {stockList: [...], cellClick: function (stock) {...}}) // 初始化, 回调函数cellClick===每一个单元格点击事件触发
 *        $(name_class_selector).priceCalender('init') // 批量初始化
 */
export default function ($) {
  // //////////////////////////////////dateUtil////////////////////////////////
  // 获取标题栏3个月份
  var get3Month = function () {
    var currMonth = new Date()
    var preMonth = new Date()
    preMonth.setMonth(new Date().getMonth() - 1)
    var nextMonth = new Date()
    nextMonth.setMonth(new Date().getMonth() + 1)
    return '<strong value="' + preMonth.getMonth() + '">' + format(preMonth, 'm月') + '</strong><strong value="' + currMonth.getMonth() + '">' + format(currMonth, 'm月') + '</strong><strong value="' + nextMonth.getMonth() + '">' + format(nextMonth, 'm月') + '</strong>'
  }

  var formatNum = function (n) {
    if (n < 10) return '0' + n
    return n
  }

  // 将日期格式化为字符串
  var format = function (date, formatStr) {
    if (arguments.length < 2 && !date.getTime) {
      formatStr = date
      date = new Date()
    }
    typeof formatStr !== 'string' && (formatStr = 'Y年M月D日 H时F分S秒')
    return formatStr.replace(/[YyMmDdHhFfSs]/g, function (a) {
      switch (a) {
        case 'y': return (date.getFullYear() + '').slice(2)
        case 'Y': return date.getFullYear()
        case 'm': return date.getMonth() + 1
        case 'M': return formatNum(date.getMonth() + 1)
        case 'd': return date.getDate()
        case 'D': return formatNum(date.getDate())
        case 'h': return date.getHours()
        case 'H': return formatNum(date.getHours())
        case 'f': return date.getMinutes()
        case 'F': return formatNum(date.getMinutes())
        case 's': return date.getSeconds()
        case 'S': return formatNum(date.getSeconds())
      }
    })
  }
  // @description 是否为为日期对象，该方法可能有坑，使用需要慎重
  // @param year {num} 日期对象
  // @return {boolean} 返回值
  var isDate = function (d) {
    if ((typeof d === 'object') && (d instanceof Date)) return true
    return false
  }
  // @description 是否为闰年
  // @param year {num} 可能是年份或者为一个date时间
  // @return {boolean} 返回值
  var isLeapYear = function (year) {
    // 传入为时间格式需要处理
    if (isDate(year)) {
      year = year.getFullYear()
    } else {
      parseInt(year)
    }
    if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) return true
    else return false
  }
  // @description 获取一个月份的天数
  // @param year {num} 可能是年份或者为一个date时间
  // @param year {num} 月份
  // @return {num} 返回天数
  var getDaysOfMonth = function (year, month) {
    if (isDate(year)) {
      month = year.getMonth()
      year = year.getFullYear()
    } else {
      year = parseInt(year)
      month = parseInt(month)
    }
    return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
  }
  // @description 获取一个月份1号是星期几，注意此时的月份传入时需要自主减一
  // @param year {num} 可能是年份或者为一个date时间
  // @param year {num} 月份
  // @return {num} 当月一号为星期几0-6
  var getBeginDayOfMouth = function (year, month) {
    if (isDate(year)) {
      month = year.getMonth()
      year = year.getFullYear()
    } else {
      year = parseInt(year)
      month = parseInt(month)
    }
    var d = new Date(year, month, 1)
    return d.getDay()
  }

  // 初始化标题栏(3个月份)
  var initHead = function ($this) {
    $this.find('#calender_title.detail_calendar_month.CalendarMonthCtrl').append(get3Month())
  }

  // 改变标题（3个月份）的样式
  var changeTitleStyle = function (e$ts) {
    var $this = null
    var index = 0
    if (e$ts.target && $(e$ts.target).is('.detail_calendar_month.CalendarMonthCtrl#calender_title strong')) {
      $this = $(e$ts.target).parent().parent().parent()
      index = $this.find('.detail_calendar_month.CalendarMonthCtrl#calender_title strong').index($(e$ts.target))
    } else {
      $this = e$ts
      index = 1
    }
    $this.find('.detail_calendar_month.CalendarMonthCtrl#calender_title strong').removeClass('colorcurrent').eq(index).addClass('colorcurrent')
  }

  // 初始化日历主体
  var initbody = function (e$ts) {
    var $this = null
    if (e$ts && $(e$ts.target).is('.detail_calendar_month.CalendarMonthCtrl#calender_title strong')) { // 点击3个月份调用时
      $this = $(e$ts.target).parent().parent().parent()
    } else { // 初始化调用时
      $this = e$ts
    }

    var currMonth = 0 // 当前选择的月份
    if (e$ts.target) {
      currMonth = parseInt($(e$ts.target).attr('value'))
    } else {
      currMonth = new Date().getMonth()
    }
    var daysOfCurrMonth = getDaysOfMonth(new Date().getFullYear(), currMonth) // 当前一个月的天数
    var beginDayOfCurrMouth = getBeginDayOfMouth(new Date().getFullYear(), currMonth) // 当前一个月第一天是星期几
    var daysOfPreMonth = getDaysOfMonth(new Date().getFullYear(), currMonth - 1) // 前一个月的天数
    var beginShowDateOfPreMonth = daysOfPreMonth - beginDayOfCurrMouth + 1 // 前一个月在日历中显示的第一天是几号

    // 构造当前月，上一个月，下一个月的日期对象
    var datePreMonth = new Date()
    datePreMonth.setMonth(currMonth - 1)
    var dateCurrMonth = new Date()
    dateCurrMonth.setMonth(currMonth)
    var dateNextMonth = new Date()
    dateNextMonth.setMonth(currMonth + 1)

    // 构造月前
    var html = ''
    for (let i = 0; i < beginDayOfCurrMouth; i++) {
      if (i % 7 === 0) {
        html += '<tr>'
      }
      datePreMonth.setDate(beginShowDateOfPreMonth + i)
      html += '<td date="' + format(datePreMonth, 'Y-M-D') + '"><a href="javascript:" class="bg_grey"> <span class="date basefix">' + (beginShowDateOfPreMonth + i) + '</span> </a></td>'
      if (i % 7 === 6) { //
        html += '</tr>'
      }
    }

    // 构造月中
    for (let i = 0; i < daysOfCurrMonth; i++) {
      if ((i + beginDayOfCurrMouth) % 7 === 0) {
        html += '<tr>'
      }
      dateCurrMonth.setDate(i + 1)
      html += '<td date="' + format(dateCurrMonth, 'Y-M-D') + '"> <a href="javascript:"> <span class="date basefix">' + (i + 1) + '</span> </a> </td> '
      if ((i + beginDayOfCurrMouth) % 7 === 6) {
        html += '</tr>'
      }
    }

    // 构造月后
    var remianDaysInCalender = 7 * 6 - daysOfCurrMonth - beginDayOfCurrMouth // 日历所有单元格 - 当前月天数 - 当前月第一天位移（星期）= 月后需构造的单元格
    for (let i = 0; i < remianDaysInCalender; i++) {
      if ((i + beginDayOfCurrMouth + daysOfCurrMonth) % 7 === 0) {
        html += '<tr>'
      }
      dateNextMonth.setDate(i + 1)
      html += '<td date="' + format(dateNextMonth, 'Y-M-D') + '"> <a href="javascript:" class="bg_grey"> <span class="date basefix">' + (i + 1) + '</span> </a> </td>'
      if ((i + beginDayOfCurrMouth + daysOfCurrMonth) % 7 === 6 || i === remianDaysInCalender - 1) {
        html += '</tr>'
      }
    }

    $this.find('.detail_calendar_table.CalendarDate#calender_body tbody').html(html) // 向价格日历的主体中写值

    // 初始化每一天的库存信息
    initStocks($this)
  }

  // 初始化每一天的库存信息
  var initStocks = function ($this) {
    var $calenderCells = $this.find('.detail_calendar_table.CalendarDate#calender_body tbody td') // 获取日历每一个日期单元格
    $.each($calenderCells, function (i, ob) {
      var $cell = $(ob) // 每一个日期单元格的jquery对象
      var cellDate = $cell.attr('date') // 每一个单元格的日期属性值
      var $cellA = $cell.find('a') // 每一个单元格中嵌套的a标签
      $.each(settings.stockList, function (i, s) {
        if (cellDate === s.date) {
          $cellA.append('<span class="date_green"> ' + (s.stock === 0 ? '满团' : '余位' + (s.stock)) + ' </span>   <span class="calendar_price01"><dfn>¥</dfn>' + s.adultSalePrice + '<em>起</em></span>').css({cursor: 'pointer'})
          $cell.bind('click.pricecalender.k_t_', s, function (e) {
            $calenderCells.css({border: ''})
            $cell.css({border: '1px solid #FF7F0E'})
            settings.cellClick(e.data)
          }) // 日历单元格（日期）点击事件
        }
      })
    })
  }

  var settings = {}

  var method = {

    init: function (options) { // 库存集合，日期点击事件
      var defaultOpts = {stockList: [], cellClick: function (stock) { alert(stock.date) }}
      settings = $.extend(defaultOpts, options)

      return this.each(function (i, ob) {
        var $this = $(ob) // ob是this，也是最高父节点，防止重名用
        $this.html('<div id="js_calendar" class="detail_calendar_warp detail_calendar_warp2">' +
          '<div class="detail_calendar_month CalendarMonthCtrl" id="calender_title"> ' +
            '<span class="month_left CalendarPrev month_default"> <i></i> </span> ' +
            '<span class="month_right CalendarNext month_default"> <i></i> </span> ' +
          '</div> ' +
          '<ul class="detail_calendar_choose" id="J_caplist" style="display: none height: auto">   </ul> ' +
          '<div style="display:none" class="group_info_alert"> <b></b> <i></i> <div class="alert_info"></div> </div> ' +
          '<table class="detail_calendar_week"> ' +
            '<tbody><tr> <td>日</td> <td>一</td> <td>二</td> <td>三</td> <td>四</td> <td>五</td> <td>六</td> </tr> </tbody>' +
          '</table> ' +
          '<div class="basefix CalendarBody"> ' +
            '<table class="detail_calendar_table CalendarDate" id="calender_body" cellspacing="0" cellpadding="0" border="0"> ' +
              '<tbody>' +
              '</tbody>' +
            '</table> ' +
          '</div>' +
        '</div>')
        initHead($this)
        changeTitleStyle($this)
        initbody($this)

        $this.find('.detail_calendar_month.CalendarMonthCtrl strong').bind('click.pricecalender.k_t_', function (e) {
          changeTitleStyle(e)
          initbody(e)
        }) // 日历标题（3个月份）点击事件
      })
    },
    destroy: function () {
      return this.each(function (i, ob) {
        var $this = $(ob)
        $this.find('.detail_calendar_month.CalendarMonthCtrl strong').unbind('click.pricecalender.k_t_') // 日历标题（3个月份）点击事件
        $this.find('.detail_calendar_table.CalendarDate#calender_body tbody td').unbind('click.pricecalender.k_t_') // 日历单元格（日期）点击事件

        $this.empty()
      })
    }
  }
  $.fn.priceCalender = function (methodName) {
    if (method[methodName]) {
      return method[methodName].apply(this, Array.prototype.slice.call(arguments, 1)) // method[methodName](arguments.slice(1)) this不同 arguments不是数组
    } else if (typeof methodName === 'object' || !methodName) {
      return method.init.apply(this, arguments)
    } else {
      $.error('Method' + methodName + 'does not exist on jQuery.datePicker')
      return this
    }
  }
}

